package meter

import (
	"context"
	"fmt"

	"github.com/gogf/gf/v2/frame/g"
)

// DBTypeControl represents the database type for electrical control operations
// DBTypeControl 表示电表控制操作的数据库类型
type DBTypeControl string

// DBTypeControl constants for electrical control operations
// 电表控制操作的数据库类型常量
const (
	DBTypeControlOpen  DBTypeControl = "10" // 开路（断开电路）
	DBTypeControlClose DBTypeControl = "11" // 闭路（接通电路）
)

// String returns the string representation of DBTypeControl
// String 返回DBTypeControl的字符串表示
func (d DBTypeControl) String() string {
	switch d {
	case DBTypeControlOpen:
		return "开路（断开电路）"
	case DBTypeControlClose:
		return "闭路（接通电路）"
	default:
		return fmt.Sprintf("未知控制类型(%s)", string(d))
	}
}

// IsValid checks if the DBTypeControl is one of the valid values
// IsValid 检查DBTypeControl是否为有效值
func (d DBTypeControl) IsValid() bool {
	switch d {
	case DBTypeControlOpen, DBTypeControlClose:
		return true
	default:
		return false
	}
}

// EleControlRequest represents the request parameters for electrical control API
// EleControlRequest 表示电表控制API的请求参数
type EleControlRequest struct {
	Address string        `json:"address" v:"required"` // 设备列表的address
	CID     string        `json:"cid" v:"required"`     // 设备列表的cid
	DBType  DBTypeControl `json:"dbType" v:"required"`  // 控制类型：10=开路，11=闭路
}

// EleControlResponse represents the complete response from electrical control API
// EleControlResponse 表示电表控制API的完整响应
type EleControlResponse struct {
	Code      int    `json:"code"`      // 响应状态码
	Message   string `json:"message"`   // 响应消息
	Timestamp string `json:"timestamp"` // 操作时间戳
	Success   bool   `json:"success"`   // 操作是否成功
}

// Validate validates the EleControlRequest parameters using GoFrame validation
// Validate 使用GoFrame验证EleControlRequest参数
func (r *EleControlRequest) Validate() error {
	// First validate the struct fields using GoFrame
	if err := g.Validator().Data(r).Run(context.Background()); err != nil {
		return err
	}

	// Validate DBType is a valid control type
	if !r.DBType.IsValid() {
		return fmt.Errorf("invalid dbType: %s, must be %s (open) or %s (close)",
			r.DBType, DBTypeControlOpen, DBTypeControlClose)
	}

	return nil
}
